#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

using std::cout;
using std::endl;


////////////////////////////////////////////信号的保存//////////////////////////////////////////////////

void handler(int sig)
{
    cout << "hello sig:" << sig << endl;
    signal(2, SIG_DFL); //默认处理
    cout << "自定义捕捉后，恢复信号的默认处理" << endl;
}

int main()
{
    signal(2, handler); //自定义捕捉2号信号
    //signal(2, SIG_IGN); //忽略信号,做了处理，处理动作就是忽略
    while(true)
    {
        sleep(1);
        cout << "." << endl;
    }
}


///////////////////////////////////////////////////pause函数///////////////////////////////////////////////////
// void handerSig(int sig)
// {
//     cout << "收到一个信号" << sig << ", pid:" <<getpid() << endl;
//     alarm(1); 
// }

// int main()
// {
//     signal(SIGALRM, handerSig); //捕捉alarm信号，alarm只会发送一次
//     alarm(1);
//     while(true)
//     {
//         pause();  //结果就是每隔一秒唤醒一次handersig
//     }
//     return 0;
// }




/////////////////////////////////////////alarm函数/////////////////////////////////////////////

// void handerSig(int sig)
// {
//     cout << "收到一个信号" << sig << ", pid:" <<getpid() << endl;
//     alarm(1); //添加这句话后alarm就会一直被发送
// }

// int main()
// {
//     signal(SIGALRM, handerSig); //捕捉alarm信号，alarm只会发送一次
//     alarm(1);
//     while(true)
//     {
//         cout << "...pid:" << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }


//  int cnt = 0;
// void handerSig(int sig)
// {
//     cout << "收到一个信号，cnt：" << cnt << endl;
//     exit(13);
// }
// int main()
// {   
//     for (int i = 0; i < 32; i++) //把所有信号全捕捉
//         signal(i, handerSig);

//     //设定一秒闹钟，1秒之后，当前进程会收到一个信号
//     alarm(1);  //unsigned int alarm(unsigned int seconds);
//               //alarm函数会发送信号

//     while(1)
//     {
//         cnt++; //不涉及IO，效率高很多，亿级别
//     }

//     return 0;
// }

//////////////////////IO操作，效率较低//////////////
// int main()
// {   
//     for (int i = 0; i < 32; i++) //把所有信号全捕捉
//         signal(i, handerSig);

//     //设定一秒闹钟，1秒之后，当前进程会收到一个信号
//     alarm(1);  //unsigned int alarm(unsigned int seconds);
//               //alarm函数会发送信号

//     while(1)
//     {
//         cout << "cnt:" << cnt << endl; //IO操作，万级别
//         cnt++;
//     }

//     return 0;
// }


///////////////////////////////////////////////////产生信号的方式：程序异常（硬件异常）///////////////////////////////////////////////////
// void handerSig(int signal) //返回值为void，参数为int就行
// {
//     cout << "收到一个信号:"  << signal << endl;
//     exit(13);
// }

// int main()
// {
//     for(int i = 1; i < 32; i++) //把所有信号自定义捕捉
//         signal(i, handerSig);

//     while(true)
//     {
//         printf("hello world, pid:%d\n", getpid());
//         sleep(1);

//         //int a = 10;
//         // a /= 0;  //设置除0错误 
//                     //会发送8号信号SIGFPE浮点数异常

//         int *p = nullptr;
//         *p = 1; //野指针问题
//                 //会发送11号信号SIGSEGV段错误
//     }
//     return 0;
// }

////////////////////////////////////////////////产生信号的方式：系统调用////////////////////////////////////////////////

// void handerSig(int signal) //返回值为void，参数为int就行
// {
//     cout << "收到一个信号:"  << signal << endl;
//    // exit(2);
// }

// void handerSig(int signal) //返回值为void，参数为int就行
// {
//     cout << "收到一个信号:"  << signal << endl;
//    // exit(2);
// }

// int main()
// {
//  for(int i = 1; i < 32; i++) //把所有信号自定义捕捉
//         signal(i, handerSig);

//     while(true)
//     {
//         printf("hello world, pid:%d\n", getpid());
//         //abort发送的信号要求进程必须处理，目的就是终止进程
//         abort(); //发送指定信号：6号信号
//         sleep(1);
//     }
//     return 0;
// }

// int main()
// {
//     for(int i = 1; i < 32; i++) //把所有信号自定义捕捉
//         signal(i, handerSig);

//     for(int i = 1; i < 32; i++) //自己给自己发送所有信号
//     {
//         sleep(1);
//         if(i == 9 || i == 19) //9和19不会被捕捉
//             continue;
//         raise(i); //自己给自己发送信号
//     }

//     while(true)
//     {
//         printf("hello world, pid:%d\n", getpid());
//         sleep(1);
//     }
//     return 0;
// }

// int main()
// {
//     signal(2, handerSig);
//     while(true)
//     {
//         printf("hello world, pid:%d\n", getpid());
//         sleep(1);
//     }
//     return 0;
// }